package com.itheima.service.impl;

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.itheima.mapper.EmpExprMapper;
import com.itheima.mapper.EmpMapper;
import com.itheima.pojo.*;
import com.itheima.service.DeptService;
import com.itheima.service.EmpService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.util.List;

@Service
public class EmpServiceImpl extends ServiceImpl<EmpMapper, Emp> implements EmpService {

    @Autowired
    private DeptService deptService;
    @Autowired
    private EmpExprMapper empExprMapper;

    /**
     * 分页查询
     *
     *
     * @return
     */
    @Override
    public PageResult findbyid(EmpQueryParam param) {


        // 执行分页查询，获取分页结果
        IPage<Emp> page1 = new Page<>(param.getPage(), param.getPageSize());

        //进行模糊查询，需要使用条件构造器

        LambdaQueryWrapper<Emp> wapper = Wrappers
                .<Emp>lambdaQuery()
                .like(param.getName() != null, Emp::getName, param.getName())//姓名
                .eq(param.getGender() != null, Emp::getGender, param.getGender())//性别
                .between(param.getBegin() != null && param.getEnd() != null, Emp::getEntryDate, param.getBegin(), param.getEnd());//入职日期
        //按修改事件降序
        wapper.orderByDesc(Emp::getUpdateTime);
        IPage<Emp> pageResult = this.page(page1, wapper);

        // 获取总记录数
        long total = pageResult.getTotal();
        // 获取当前页的数据记录
        List<Emp> records = pageResult.getRecords();

        if (!CollectionUtils.isEmpty(records)) {
            //先取出所有部门ID
            List<Integer> list = records.stream().map(emp -> emp.getDeptId()).toList();
            //去重
            list = list.stream().distinct().toList();
            //根据部门id集合查询所有的部门列表
            List<dDept> dDepts = deptService.listByIds(list);
            //双重for循环，对每一个emp对象的deptname属性赋值
            records.forEach(emp -> {
                dDepts.stream().filter(dDept -> dDept.getId().equals(emp.getDeptId()))
                        .findFirst()//有就返回，没有就不返回
                        .ifPresent(dDept -> emp.setDeptName(dDept.getName()));//如果有数据就赋值
            });
        }


        // 封装分页结果并返回
        return new PageResult(total, records);

    }

    /**
     * 新增员工
     *
     * @param emp
     */
    @Override
    public void saveEmp(Emp emp) {
        //1.新增emp表
        emp.setPassword("123456");
        emp.setCreateTime(LocalDateTime.now());
        emp.setUpdateTime(LocalDateTime.now());
        this.save(emp);
        //2.批量新增工作经历
        List<EmpExpr> exprList = emp.getExprList();
        if (!CollectionUtils.isEmpty(exprList)) {
            //给工作经历赋值empid进行数据绑定
            exprList.forEach(empExpr -> empExpr.setEmpId(emp.getId()));
            empExprMapper.insert(exprList);
        }

        //3.记录日志
    }

    /**
     * 查询回显
     *
     * @param id
     * @return
     */
    @Override
    public Emp getempbyid(Integer id) {
        //1.查询员工信息
        Emp byId = this.getById(id);
        //2.查询工作经历信息
        List<EmpExpr> empExprs = empExprMapper.selectList(Wrappers.<EmpExpr>lambdaQuery().eq(EmpExpr::getEmpId, id));
        //3.工作经历封装到员工
        byId.setExprList(empExprs);
        return byId;
    }

    /**
     * 修改员工
     *
     * @param emp
     */
    @Override
    public void updateEmp(Emp emp) {
        //1.修改员工信息
        emp.setUpdateTime(LocalDateTime.now());
        this.updateById(emp);
        //2.删除所用工作经历，因为无法进行批量修改,从后端取
        List<EmpExpr> empExprs = empExprMapper.selectList(Wrappers.<EmpExpr>lambdaQuery().eq(EmpExpr::getEmpId, emp.getId()));
        empExprMapper.deleteByIds(empExprs);
        //3.批量新增工作经历
        List<EmpExpr> exprList = emp.getExprList();
        if (!CollectionUtils.isEmpty(exprList)) {
            exprList.forEach(empExpr -> empExpr.setEmpId(emp.getId()));
            empExprMapper.insert(exprList);
        }

    }

    /**
     * 可以批量删除
     *
     * @param ids
     */
    @Override
    public void deletee(List<Integer> ids) {
        //1.删除员工
        this.removeByIds(ids);
        //2.删除工作经历
        empExprMapper.delete(Wrappers.<EmpExpr>lambdaQuery().in(EmpExpr::getEmpId, ids));

    }


}
